#include <iostream>
#include <omp.h>
#include <cstdlib>

#pragma omp declare target
float F(float x)
{
    // 示例函数实现（可修改为实际需要的操作）
    return x * 2.0f;
}
#pragma omp end declare target

const int N = 1000000;      // 减小数组大小以便测试
const int CHUNKSZ = 100000; // 减小块大小

void init(float *arr, int size)
{
#pragma omp parallel for
    for (int i = 0; i < size; i++)
    {
        arr[i] = static_cast<float>(i);
    }
}

void pipedF()
{
    float *Z = new float[N]; // 动态内存分配避免栈溢出
    init(Z, N);

#pragma omp parallel
#pragma omp single
    {
        for (int C = 0; C < N; C += CHUNKSZ)
        {
#pragma omp task shared(Z)
            {
// 移除了target构造以兼容性优先
#pragma omp parallel for
                for (int i = C; i < std::min(C + CHUNKSZ, N); i++)
                {
                    Z[i] = F(Z[i]);
                }
            }
        }
#pragma omp taskwait
    }

    // 验证结果（可选）
    std::cout << "First 5 elements: ";
    for (int i = 0; i < 5; i++)
        std::cout << Z[i] << " ";
    std::cout << "\n";

    delete[] Z;
}

int main()
{
    pipedF();
    return 0;
}